#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 100

typedef  int ElemType;  /*定义表元素的类型*/
typedef struct {
	ElemType* elem;      /*存储空间的基地址*/
	int length;           /*顺序表的当前长度*/
} SqList;

int InitList_sq(SqList& L);               //   顺序表分配存储空间                  
int InputList_sq(SqList& L);        //    向顺序表输入元素                             
int PrintList_sq(SqList* L);          //输出顺序表的元素遍历
void addList(SqList* L, int elem, int add);//插入函数，其中，elem为插入的元素，add为插入到顺序表的位置
void delList(SqList* L, int add);//删除指定位置
int searchList(SqList* L, int elem);//查找函数，其中，elem表示要查找的数据元素的值
void destoryList(SqList* L);// 销毁
void ClearList(SqList* L);// 清空
int ListEmpty(SqList* L);//判断是否空
int GetLen(SqList* L);//获取长度


int main() {
	printf("     请选择对应操作:\n");
	printf("     1:创建并初始化顺序表 \n");
	printf("     2:向顺序表中输入 \n");
	printf("     3:输出顺序表 \n");
	printf("     4:插入元素到顺序表 \n");
	printf("     5:删除顺序表中指定元素 \n");
	printf("     6:查找的数据元素的位置 \n");
	printf("     7:销毁顺序表 \n");
	printf("     8:清空顺序表 \n");
	printf("     9:判断顺序表是否为空 \n");
	printf("     10:获取顺序表长度 \n");
	printf("     0:退出顺序表 \n");
	while (1)
	{
		int n = 0;//顺序表操作
		int x = 0;//是否退出顺序表
		int a = 0;//插入元素
		int i = 0;//元素位置
		printf("请选择对应操作:");
		scanf("%d", &n);
		switch (n)
		{
		case 0:
			x == 1;
			break;
		case 1:
			SqList sl;
			InitList_sq(sl);
			break;
		case 2:
			InputList_sq(&sl);
			break;
		case 3:
			PrintList_sq(&sl);
			break;
		case 4:		
			printf("请输入插入元素及位置:");
			scanf("%d %d", &a, &i);
			addList(&sl, a, i);//a插入元素，i插入位置
			break;
		case 5:
			printf("请输入删除元素的位置:");
			scanf("%d", &i);
			delList(&sl, i);
			break;
		case 6:
			printf("请输入查找元素:");
			scanf("%d", &a);
			i=searchList(&sl,a);
			printf("该元素的位置为%d\n", i);
			break;
		case 7:
			destoryList(&sl);// 销毁
			break;
		case 8:
			ClearList(&sl);// 清空
			printf("该顺序表已清空!\n");
			break;
		case 9:
			i=ListEmpty(&sl);//判断是否空
			if (i == 1)
			{
				printf("该顺序表不为空!\n");
			}
			else
			{
				printf("该顺序表为空!\n");
			}
			break;
		case 10:
			i=GetLen(&sl);//获取长度
			printf("该顺序表的长度为:%d\n", i);
			break;
		}
		if (x == 1)
		{
			break;
		}
	}
	return 0;
}


int InitList_sq(SqList& L) {

	L.elem = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
	if (!L.elem)
		return ERROR;
	L.length = 0;
	return OK;
}/*InitList*/

int InputList_sq(SqList* L) {
	ElemType e;
	int i = 0;
	printf("输入元素 %d : ", i + 1);
	scanf("%d", &e);
	while (e != -1) 
	{
		L->elem[i] = e;
		i++;
		printf("输入元素 %d : ", i + 1);
		scanf("%d", &e);
	}
	L->length = i;

	return OK;
}/*InputList*/


int PrintList_sq(SqList* L) {
	int i;
	if (!L->length) 
	{
		printf("该顺序表为空!\n");
	}
	else {
		for (i = 1; i <= L->length; i++)
			printf("%5d", L->elem[i - 1]);
		printf("\n");
	}
	return OK;
}/*PrintList*/


void addList(SqList* L, int elem, int add)
{//插入函数，其中，elem为插入的元素，add为插入到顺序表的位置
	if (!L->length)
	{
		printf("该顺序表为空!\n");
	}
	else
	{
		for (int i = L->length; i >= add; i--)
		{
			L->elem[i] = L->elem[i-1];
		}
		L->elem[add-1] = elem;
		L->length++;
	}
}

void delList(SqList* L, int add)
{//删除指定位置
	if (!L->length)
	{
		printf("该顺序表为空!\n");
	}
	else
	{
		if (add == L->length)
		{
			L->elem[add - 1] = 0;
			L->length--;
		}
		else
		{
			for (int i = add; i <L->length; i++)
			{
				L->elem[i - 1] = L->elem[i];
			}
			L->elem[L->length-1]=0;
			L->length--;
		}		
	}
}

int searchList(SqList* L, int elem)//查找函数，其中，elem表示要查找的数据元素的值
{
	for (int i = 0; i < L->length; i++)
	{
		if (L->elem[i] == elem)
		{
			return i + 1;
		}
	}
	return ERROR;
}

void destoryList(SqList* L)// 销毁
{
	if (L->elem != NULL)
	{
		free(L->elem);
	}
	L->elem = NULL;
	printf("释放动态数组内存\n");
}

void ClearList(SqList* L)
{
	L->length = 0; // 将顺序表的长度置为 0
}

int ListEmpty(SqList* L)//判断是否空
{
	if (L->length != 0)
	{
		return OK;
	}
	return ERROR;
}

int GetLen(SqList* L)
{
	return L->length;
}